package org.example.bean;


import java.util.Objects;

/**
 * @Desc:
 * @Author: yanghongjun
 * @Date: 2024/5/14
 **/

public class LazyNode {
    /**
     * 节点在地图上的x坐标。
     */
    private int x;

    /**
     * 节点在地图上的y坐标。
     */
    private int y;

    /**
     * 从起点到当前节点的已知最佳路径成本。
     */
    private double gScore;

    /**
     * 从当前节点到终点的启发式估计成本。
     */
    private double hScore;

    /**
     * fScore 是 gScore 和 hScore 的和，用于在开放列表（Open Set）中排序节点。
     */
    private double fScore;

    /**
     * 当前节点的父节点，在重构路径时使用。
     */
    private LazyNode parent;

    /**
     * 标志位，表示当前节点是否在开放列表（Open Set）中。
     */
    private boolean inOpenSet;
    /**
     * 寻路过来的方向
     */
    private int direction;

    public LazyNode() {
    }

    /**
     * 构造一个新的LazyNode对象，给定其在地图上的坐标（x, y）。
     *
     * @param x 节点在地图上的x坐标
     * @param y 节点在地图上的y坐标
     */
    public LazyNode(int x, int y) {
        this.x = x;
        this.y = y;
    }

    /**
     * 构造一个新的LazyNode对象，给定其在地图上的坐标（x, y）。
     *
     * @param x 节点在地图上的x坐标
     * @param y 节点在地图上的y坐标
     */
    public LazyNode(int x, int y, int direction) {
        this.x = x;
        this.y = y;
        this.direction = direction;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        LazyNode node = (LazyNode) obj;
        return x == node.x && y == node.y;
    }

    @Override
    public int hashCode() {
        return Objects.hash(x, y);
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public double getgScore() {
        return gScore;
    }

    public void setgScore(double gScore) {
        this.gScore = gScore;
    }

    public double gethScore() {
        return hScore;
    }

    public void sethScore(double hScore) {
        this.hScore = hScore;
    }

    public double getfScore() {
        return fScore;
    }

    public void setfScore(double fScore) {
        this.fScore = fScore;
    }

    public LazyNode getParent() {
        return parent;
    }

    public void setParent(LazyNode parent) {
        this.parent = parent;
    }

    public boolean isInOpenSet() {
        return inOpenSet;
    }

    public void setInOpenSet(boolean inOpenSet) {
        this.inOpenSet = inOpenSet;
    }

    public int getDirection() {
        return direction;
    }

    public void setDirection(int direction) {
        this.direction = direction;
    }

    public void reset() {
        x = 0;
        y = 0;
        gScore = 0;
        hScore = 0;
        fScore = 0;
        parent = null;
        direction = 0;
    }
}
